home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / swag / textfile.swg / 0049_Pascal Poetry.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-02-28  |  4.5 KB  |  213 lines

  1. UNIT PoetryU;
  2.  
  3. INTERFACE 
  4.  
  5. VAR 
  6.   Vowels, 
  7.   Conson  : SET OF CHAR; 
  8.  
  9. FUNCTION NumWords( S : STRING ) : INTEGER; 
  10. FUNCTION GetWord( S : STRING; WhichWord : INTEGER ) : STRING; 
  11. FUNCTION Word_Syll( S : STRING ) : INTEGER;
  12. FUNCTION Sent_Syll( S : STRING ) : INTEGER; 
  13. FUNCTION UCase( S : STRING ) : STRING; 
  14.  
  15. IMPLEMENTATION 
  16.  
  17.  
  18. FUNCTION UCase( S : STRING ) : STRING; 
  19. VAR 
  20.   Count : INTEGER; 
  21.  
  22. Begin 
  23.   FOR Count := 1 TO Length( S ) DO
  24.     S[ Count ] := UpCase( S[ Count ] ); 
  25.  
  26.   UCase := S; 
  27. End; 
  28.  
  29. FUNCTION RightStr( S : STRING; Index : BYTE ) : STRING; 
  30. Begin 
  31.   RightStr := Copy( S, Index, Length( S ) ); 
  32. End; 
  33.  
  34. { This function returns the number of words within a given string. } 
  35. FUNCTION NumWords( S : STRING ) : INTEGER;
  36. VAR 
  37.   Words, 
  38.   Count : INTEGER; 
  39.  
  40. Begin 
  41.   Words := 0;
  42.   Count := 0; 
  43.  
  44.   S := UCase( S ); 
  45.  
  46.   WHILE Count <> Length( S ) DO 
  47.   Begin
  48.     INC( Count ); 
  49.  
  50.     IF S[Count] IN ['A'..'Z'] THEN 
  51.     Begin 
  52.       INC( Words ); 
  53.  
  54.       WHILE (S[Count] IN ['A'..'Z', '''']) AND (Count < Length( S )) DO 
  55.         INC( Count ); 
  56.     End; 
  57.   End; 
  58.  
  59.   NumWords := Words;
  60. End; 
  61.  
  62. { This function will return a word (1st, 2nd, 3rd, etc) from a sentence. 
  63.   Note that it converts the word to uppercase. } 
  64. FUNCTION GetWord( S : STRING; WhichWord : INTEGER ) : STRING; 
  65. VAR 
  66.   WC, 
  67.   Count : INTEGER; 
  68.   Temp  : STRING; 
  69.  
  70. Begin 
  71.   WC    := 0;
  72.   Count := 0; 
  73.   Temp  := ''; 
  74.  
  75.   IF WhichWord > NumWords( S ) THEN 
  76.   Begin 
  77.     GetWord := ''; 
  78.     Exit; 
  79.   End; 
  80.  
  81.   S := UCase( S );
  82.  
  83.   WHILE Count < Length( S ) DO
  84.   Begin 
  85.     INC( Count ); 
  86.  
  87.     IF S[Count] IN ['A'..'Z'] THEN 
  88.     Begin 
  89.       INC( WC ); 
  90.  
  91.       IF WC = WhichWord THEN 
  92.         WHILE (S[Count] IN ['A'..'Z']) AND (Count <= Length( S )) DO 
  93.         Begin 
  94.           Temp := Temp + S[Count]; 
  95.           INC( Count );
  96.         End 
  97.       ELSE 
  98.         WHILE (S[Count] IN ['A'..'Z']) AND (Count <= Length( S )) DO 
  99.           INC( Count ); 
  100.     End; 
  101.   End;
  102.  
  103.   GetWord := Temp; 
  104. End; 
  105.  
  106. { This function will return the number of syllables in a given word. 
  107.   It is in no way a fool-proof function, but will work for a lot of words. }
  108. FUNCTION Word_Syll( S : STRING ) : INTEGER; 
  109. VAR 
  110.   Count, 
  111.   SylCount : INTEGER; 
  112.  
  113. Begin 
  114.   { No syllables! } 
  115.   SylCount := 0; 
  116.  
  117.   S := UCase( S ); 
  118.  
  119.   { If it starts with a vowel, there is a good chance an extra syllable is in
  120.     there. } 
  121.   IF (S[1] IN Vowels) AND (Length( S ) > 3) THEN
  122.     SylCount := 1; 
  123.  
  124.   IF (Pos( 'IO', S ) > 0) THEN 
  125.     INC( SylCount ); 
  126.   IF (Pos( 'EO', S ) > 0) THEN 
  127.     INC( SylCount ); 
  128.   IF (Pos( 'IA', S ) > 0) THEN 
  129.     INC( SylCount ); 
  130.   IF (Pos( 'ISM', S ) > 0) THEN 
  131.     INC( SylCount );
  132.   IF ((Pos( 'UA', S ) > 0) AND (Pos( 'QUA', S ) = 0)) THEN 
  133.     INC( SylCount ); 
  134.   IF (Pos( 'TION', S ) OR (Pos( 'SION', S )) <> 0) THEN 
  135.     DEC( SylCount ); 
  136.  
  137.   FOR Count := 1 TO (Length( S ) - 1) DO 
  138.     IF (S[Count] IN Conson) AND (S[Count + 1] IN Vowels) THEN 
  139.       INC( SylCount ); 
  140.  
  141.   IF (S[Length( S )] = 'E') AND (Pos( 'BLE', RightStr( S, 3 )) = 0) AND
  142.      (Pos( 'IE',  RightStr( S, 2 )) = 0) AND 
  143.      (Pos( 'TLE', RightStr( S, 3 )) = 0) THEN
  144.     DEC( SylCount ); 
  145.  
  146.   { A word must have at least 1 syllable!! } 
  147.   IF SylCount < 1 THEN 
  148.     SylCount := 1; 
  149.  
  150.   Word_Syll := SylCount; 
  151. End; 
  152.  
  153. { This function will count the number of syllables in a given sentence. } 
  154. FUNCTION Sent_Syll( S : STRING ) : INTEGER; 
  155. VAR
  156.   Count, 
  157.   SylCount : INTEGER; 
  158.   Temp     : STRING; 
  159.  
  160. Begin 
  161.   SylCount := 0; 
  162.  
  163.   FOR Count := 1 TO NumWords( S ) DO 
  164.     INC( SylCount, Word_Syll( GetWord( S, Count ) ) ); 
  165.  
  166.   Sent_Syll := SylCount; 
  167. End; 
  168.  
  169. PROCEDURE InitVowels; 
  170. Begin 
  171.   Vowels := ['A', 'E', 'I', 'O', 'U', 'Y']; 
  172. End; 
  173.  
  174. PROCEDURE InitConson; 
  175. VAR 
  176.   Ch : CHAR; 
  177.  
  178. Begin 
  179.   Conson := []; 
  180.  
  181.   FOR Ch := 'A' TO 'Z' DO 
  182.     IF NOT (Ch IN Vowels) THEN 
  183.       Conson := Conson + [ Ch ]; 
  184. End; 
  185.  
  186. BEGIN 
  187.   InitVowels; 
  188.   InitConson; 
  189. END. 
  190.  
  191. { -------------------------  DEMO ----------------------- }
  192.  
  193.  
  194. USES Crt, PoetryU;
  195.  
  196. CONST 
  197.   TEST = 'These are a few interesting functions, man.'; 
  198.  {TEST = 'antidisestablishmentarianism';} 
  199.  
  200. VAR 
  201.   AWord : STRING; 
  202.  
  203. BEGIN 
  204.   ClrScr; 
  205.  
  206.   AWord := GetWord( TEST, NumWords( TEST ) ); 
  207.  
  208.   WriteLn( 'The last word is : ', AWord ); 
  209.   WriteLn( '# of syllables   : ', Word_Syll( AWord ) ); 
  210.   WriteLn( 'Total # of words : ', NumWords( TEST ) ); 
  211.   WriteLn( 'Total syllables  : ', Sent_Syll( TEST ) );
  212. END.
  213.